/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright(c) 2020 - 2023 Allwinner Technology Co.,Ltd. All rights reserved. */
/*
 * Allwinner SoCs display driver.
 *
 * Copyright (C) 2016 Allwinner.
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */
#ifndef __DE_WB_TYPE_H__
#define __DE_WB_TYPE_H__

#define ____SEPARATOR_DEFEINE____
#define WB_END_IE				0x1
#define WB_FINISH_IE (0x1<<4)
#define WB_FIFO_OVERFLOW_ERROR_IE (0x1<<5)
#define WB_TIMEOUT_ERROR_IE (0x1<<6)

#define MININWIDTH 8
#define MININHEIGHT 4
#define MAXINWIDTH 4096		/* support 8192,limit by LCD */
#define MAXINHEIGHT 4096	/* support 8192,limit by LCD */
#define LINE_BUF_LEN 2048
#define LOCFRACBIT 18
#define SCALERPHASE 16

#define ____SEPARATOR_REGISTERS____
typedef union {
	unsigned int dwval;
	struct {
		unsigned int wb_start:1;	/* bit0 */
		unsigned int r0:3;	/* bit1~3 */
		unsigned int soft_reset:1;	/* bit4 */
		unsigned int r1:11;	/* bit5~15 */
		unsigned int in_port_sel:2;	/* bit16~17 */
		unsigned int r2:10;	/* bit18~27 */
		unsigned int auto_gate_en:1;	/* bit28 */
		unsigned int clk_gate:1;	/* bit29 */
		unsigned int r3:1;	/* bit30 */
		unsigned int bist_en:1;	/* bit31 */
	} bits;
} __wb_gctrl_reg_t;		/* 0x00 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __wb_size_reg_t;		/* 0x04 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int crop_left:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int crop_top:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __wb_crop_coord_reg_t;	/* 0x08 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int crop_width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int crop_height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __wb_crop_size_reg_t;		/* 0x0c */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int addr:32;	/* bit0~31 */
	} bits;
} __wb_addr_reg_t;		/* 0x10 0x14 0x18 0x20 0x24 0x28 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int ch0_h_addr:8;	/* bit0~7 */
		unsigned int ch1_h_addr:8;	/* bit8~15 */
		unsigned int ch2_h_addr:8;	/* bit16~23 */
		unsigned int r0:8;	/* bit24~31 */
	} bits;
} __wb_high_addr_reg_t;		/* 0x1c 0x2c */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int pitch:32;	/* bit0~31 */
	} bits;
} __wb_pitch_reg_t;		/* 0x30 0x34 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int cur_group:1;	/* bit0 */
		unsigned int r0:15;	/* bit1~15 */
		unsigned int auto_switch:1;	/* bit16 */
		unsigned int r1:3;	/* bit17~19 */
		unsigned int manual_group:1;	/* bit20 */
		unsigned int r2:11;	/* bit21-31 */
	} bits;
} __wb_addr_switch_reg_t;	/* 0x40 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int format:4;	/* bit0~3 */
		unsigned int r0:28;	/* bit4~31 */
	} bits;
} __wb_format_reg_t;		/* 0x44 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int int_en:1;	/* bit0 */
		unsigned int r0:31;	/* bit1~31 */
	} bits;
} __wb_int_reg_t;		/* 0x48 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int irq:1;	/* bit0 */
		unsigned int r0:3;	/* bit1~3 */
		unsigned int finish:1;	/* bit4 */
		unsigned int overflow:1;	/* bit5 */
		unsigned int timeout:1;	/* bit6 */
		unsigned int r1:1;	/* bit7 */
		unsigned int busy:1;	/* bit8 */
		unsigned int r2:23;	/* bit9~31 */
	} bits;
} __wb_status_reg_t;		/* 0x4c */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int csc_en:1;	/* bit0 */
		unsigned int cs_en:1;	/* bit1 */
		unsigned int fs_en:1;	/* bit2 */
		unsigned int r0:29;	/* bit3~31 */
	} bits;
} __wb_bypass_reg_t;		/* 0x54 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int m:13;	/* bit0~12 */
		unsigned int r1:3;	/* bit13~15 */
		unsigned int n:13;	/* bit16~28 */
		unsigned int r0:3;	/* bit29~31 */
	} bits;
} __wb_cs_reg_t;		/* 0x70 0x74 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int width:13;	/* bit0~12 */
		unsigned int r1:3;	/* bit13~15 */
		unsigned int height:13;	/* bit16~28 */
		unsigned int r0:3;	/* bit29~31 */
	} bits;
} __wb_fs_size_reg_t;		/* 0x80 0x84 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int r1:2;	/* bit0~1 */
		unsigned int frac:18;	/* bit2~19 */
		unsigned int intg:2;	/* bit20~21 */
		unsigned int r0:10;	/* bit22~31 */
	} bits;
} __wb_fs_step_reg_t;		/* 0x88 0x8c */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int coef0:8;	/* bit0~7 */
		unsigned int coef1:8;	/* bit8~15 */
		unsigned int coef2:8;	/* bit16~23 */
		unsigned int coef3:8;	/* bit24~31 */
	} bits;
} __wb_coeff_reg_t;		/* 0x200+N*4    0x280+N*4   (N = 0~15) */

typedef struct {
	__wb_gctrl_reg_t gctrl;	/* 0x0000 */
	__wb_size_reg_t size;	/* 0x0004 */
	__wb_crop_coord_reg_t crop_coord;	/* 0x0008 */
	__wb_crop_size_reg_t crop_size;	/* 0x000c */
	__wb_addr_reg_t wb_addr_A0;	/* 0x0010 */
	__wb_addr_reg_t wb_addr_A1;	/* 0x0014 */
	__wb_addr_reg_t wb_addr_A2;	/* 0x0018 */
	__wb_high_addr_reg_t wb_addr_AH;	/* 0x001c */
	__wb_addr_reg_t wb_addr_B0;	/* 0x0020 */
	__wb_addr_reg_t wb_addr_B1;	/* 0x0024 */
	__wb_addr_reg_t wb_addr_B2;	/* 0x0028 */
	__wb_high_addr_reg_t wb_addr_BH;	/* 0x002c */
	__wb_pitch_reg_t wb_pitch0;	/* 0x0030 */
	__wb_pitch_reg_t wb_pitch1;	/* 0x0034 */
	unsigned int res0[2];	/* 0x0038-0x003c */
	__wb_addr_switch_reg_t addr_switch;	/* 0x0040 */
	__wb_format_reg_t fmt;	/* 0x0044 */
	__wb_int_reg_t intr;	/* 0x0048 */
	__wb_status_reg_t status;	/* 0x004c */
	unsigned int res1;	/* 0x0050 */
	__wb_bypass_reg_t bypass;	/* 0x0054 */
	unsigned int res2[6];	/* 0x0058-0x006c */
	__wb_cs_reg_t cs_horz;	/* 0x0070 */
	__wb_cs_reg_t cs_vert;	/* 0x0074 */
	unsigned int res3[2];	/* 0x0078-0x007c */
	__wb_fs_size_reg_t fs_insize;	/* 0x0080 */
	__wb_fs_size_reg_t fs_outsize;	/* 0x0084 */
	__wb_fs_step_reg_t fs_hstep;	/* 0x0088 */
	__wb_fs_step_reg_t fs_vstep;	/* 0x008c */
	unsigned int res4[92];	/* 0x0090-0x01fc */
	__wb_coeff_reg_t yhcoeff[16];	/* 0X0200-0x23c */
	unsigned int res5[16];	/* 0X0240-0x27c */
	__wb_coeff_reg_t chcoeff[16];	/* 0X0280-0x2bc */
	unsigned int res6[16];	/* 0x02c0-0x02fc */
} __wb_reg_t;

typedef enum {
	WB_FORMAT_RGB_888 = 0x0,
	WB_FORMAT_BGR_888 = 0x1,
	WB_FORMAT_ARGB_8888 = 0x4,
	WB_FORMAT_ABGR_8888 = 0x5,
	WB_FORMAT_BGRA_8888 = 0x6,
	WB_FORMAT_RGBA_8888 = 0x7,
	WB_FORMAT_YUV420_P = 0x8,
	WB_FORMAT_YUV420_SP_VUVU = 0xc,
	WB_FORMAT_YUV420_SP_UVUV = 0xd,
} wb_output_fmt;

extern unsigned int wb_lan2coefftab16[16];
extern unsigned int wb_lan2coefftab16_down[16];

#endif
